package cn.minhx.infrastructure.adapter.repository;

import cn.minhx.domain.crowd.adapter.repository.ICrowdRepository;
import cn.minhx.domain.crowd.model.entity.CrowdTagsJobEntity;
import cn.minhx.infrastructure.dao.ICrowdTagsDAO;
import cn.minhx.infrastructure.dao.ICrowdTagsDetailDAO;
import cn.minhx.infrastructure.dao.ICrowdTagsJobDAO;
import cn.minhx.infrastructure.dao.po.CrowdTags;
import cn.minhx.infrastructure.dao.po.CrowdTagsDetail;
import cn.minhx.infrastructure.dao.po.CrowdTagsJob;
import cn.minhx.infrastructure.redis.IRedisService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBitSet;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Repository;

/**
 * 人群标签仓储
 *
 * @author min
 */
@Slf4j
@Repository
public class CrowdRepository implements ICrowdRepository {

	@Resource
	private ICrowdTagsDAO crowdTagsDAO;
	@Resource
	private ICrowdTagsDetailDAO crowdTagsDetailDAO;
	@Resource
	private ICrowdTagsJobDAO crowdTagsJobDAO;
	@Resource
	private IRedisService redisService;

	@Override
	public CrowdTagsJobEntity queryCrowdTagsJobEntity(String tagId, String batchId) {
		CrowdTagsJob crowdTagsJobReq = new CrowdTagsJob();
		crowdTagsJobReq.setTagId(tagId);
		crowdTagsJobReq.setBatchId(batchId);

		CrowdTagsJob crowdTagsJobRes = crowdTagsJobDAO.queryCrowdTagsJob(crowdTagsJobReq);
		if (null == crowdTagsJobRes)
			return null;

		return CrowdTagsJobEntity.builder().tagType(crowdTagsJobRes.getTagType()).tagRule(crowdTagsJobRes.getTagRule())
				.statTime(crowdTagsJobRes.getStartTime()).statEndTime(crowdTagsJobRes.getStatEndTime()).build();
	}

	@Override
	public void addCrowdTagsUserId(String tagId, String userId) {
		CrowdTagsDetail crowdTagsDetailReq = new CrowdTagsDetail();
		crowdTagsDetailReq.setTagId(tagId);
		crowdTagsDetailReq.setUserId(userId);
		try {
			crowdTagsDetailDAO.addCrowdTagsUserId(crowdTagsDetailReq);
			// 获取BitSet
			// 占用内存按最大的key算， 最大key一千万占用3MB
			RBitSet bitSet = redisService.getBitSet(tagId);
			int indexFromUserId = redisService.getIndexFromUserId(userId);
			bitSet.set(indexFromUserId, true);
		} catch (DuplicateKeyException ignore) {
			// 忽略唯一索引冲突
			log.info("userId:{} already exist", userId);
		}
	}

	@Override
	public void updateCrowdTagsStatistics(String tagId, int count) {
		CrowdTags crowdTagsReq = new CrowdTags();
		crowdTagsReq.setTagId(tagId);
		crowdTagsReq.setStatistics(count);
		crowdTagsDAO.updateCrowdTagsStatistics(crowdTagsReq);
	}
}
